﻿using System.Collections.Generic;
using NHibernate;
using NHibernate.Criterion;
using Neturion.Dados;
using Neturion.IRepositorios;

namespace Neturion.Repositorios
{
    public class RepositorioProduto : IRepositorioProduto
    {
        public Produto Inserir(Produto produto)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Save(produto);
            return produto;
        }

        public Produto Atualizar(Produto produto)
        {
            Produto tmpProduto = ObterPorId(produto.ProdutoId);
            // Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados
            tmpProduto.Codigo = produto.Codigo;
            tmpProduto.Descricao = produto.Descricao;
            
            tmpProduto.ListaFornecedores.Clear();
            foreach (Fornecedor fornecedor in produto.ListaFornecedores)
            {
                tmpProduto.AdicionarFornecedor(fornecedor);
            }

            GerenciadorBDConfigs.Instance.SessaoAtual().Merge(tmpProduto);
            return tmpProduto;
        }

        public void Excluir(Produto produto)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(produto);
        }

        public IList<Produto> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Produto));
            return criteria.List<Produto>() as List<Produto>;
        }

        public Produto ObterPorId(int id)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().Get<Produto>(id);
        }

        public Produto ObterPorCodigo(string codigo)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Produto))
                .Add(Restrictions.Eq("Codigo", codigo));

            return criteria.UniqueResult<Produto>() as Produto;
        }
    }
}